home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1999 March / EnigmA AMIGA RUN 35 (1999)(G.R. Edizioni)(IT)[!][issue 1999-03].iso / earcd / devel / vbcc-68k-src / machines / amiga68k / libsrc / math / math_040 / ldexp.c < prev    next >
C/C++ Source or Header  |  1999-01-01  |  837b  |  36 lines

  1. #include <math.h>
  2.  
  3. #define MANT_MASK 0x800FFFFF    /* Mantissa extraction mask     */
  4. #define ZPOS_MASK 0x3FF00000    /* Positive # mask for exp = 0  */
  5. #define ZNEG_MASK 0x3FF00000    /* Negative # mask for exp = 0  */
  6.  
  7. #define EXP_MASK 0x7FF00000     /* Mask for exponent            */
  8. #define EXP_SHIFTS 20           /* Shifts to get into LSB's     */
  9. #define EXP_BIAS 1023           /* Exponent bias                */
  10.  
  11.  
  12. union dtol
  13. {
  14.   double dval;
  15.   int ival[2];
  16. };
  17.  
  18. double ldexp (double x,int n)
  19. {
  20.   union dtol number;
  21.   int *iptr, cn;
  22.  
  23.   if (x == 0.0)
  24.     return (0.0);
  25.   else
  26.     {
  27.       number.dval = x;
  28.       iptr = &number.ival[0];
  29.       cn = (((*iptr) & EXP_MASK) >> EXP_SHIFTS) - EXP_BIAS;
  30.       *iptr &= ~EXP_MASK;
  31.       n += EXP_BIAS;
  32.       *iptr |= ((n + cn) << EXP_SHIFTS) & EXP_MASK;
  33.       return (number.dval);
  34.     }
  35. }
  36.